001    /**
002     * Created by IntelliJ IDEA.
003     * User: Wei Wang
004     * Date: Feb 9, 2003
005     * Time: 5:21:17 PM
006     */
007    
008    package EVolve.visualization.XYViz.ValValViz;
009    
010    import EVolve.data.*;
011    import EVolve.visualization.*;
012    import EVolve.visualization.Dimension;
013    import EVolve.visualization.VizFactory.VisualizationFactory;
014    import EVolve.util.painters.*;
015    import EVolve.util.predefinedutils.VizInfo;
016    import EVolve.Scene;
017    import EVolve.exceptions.VizInfoCreateException;
018    import EVolve.exceptions.NoDataPlotException;
019    
020    import javax.swing.*;
021    import java.awt.*;
022    import java.awt.event.*;
023    import java.awt.image.BufferedImage;
024    import java.util.*;
025    
026    public class EventViz extends ValueValueVisualization{
027        private JTextField textBegin,textEnd,textBoxSize;
028        private int boxSize = 10;
029        private ArrayList menuList;
030        private JMenuItem itemReArrange, itemSelectX, itemSelectTimeFrame, selectionMenu[] = null;
031        private static int SELECT_OPTION = 0x0011;
032        private JComboBox comboPainter,comboPredictor;
033        private Painter[] painters;
034        private int selectedPainter;
035        private PredictorFactory[] factory; // predictor factories
036        private Predictor[] predictor; // predictors
037        private AutoImage entityMapImage;
038        private final int PredictionPainter = 0, RandomColorPainter = 1, DefaultPainter = 2;
039        private JLabel toEventNo;
040    
041    
042        public EventViz(PredictorFactory[] factory) {
043            super();
044            menuList = new ArrayList();
045    
046            beginCall = 0;
047            endCall = 300;
048            interval = 1;
049            selectedPainter = 0;
050            painters = createPainters();
051            this.factory = factory;
052            flipMagnifier = false;
053        }
054    
055        private Painter[] createPainters() {
056            Painter[] painters = new Painter[3];
057            painters[0] = new EventPredictionPainter();
058            painters[1] = new RandomPainter();
059            painters[2] = new DefaultPainter();
060            return painters;
061        }
062    
063        public void autoUpdateConfiguration(HashMap config) {
064            super.autoUpdateConfiguration(config);
065            if (config.get("Match")!=null) {
066                boxSize = (int)((Float)(config.get("Match"))).floatValue();
067            }
068            if (config.get("Options")!=null) {
069                String painterName = (String)config.get("Options");
070                for (int i=0; i<painters.length; i++)
071                    if (painters[i].getName().equals(painterName)) {
072                        selectedPainter = i;
073                        break;
074                    }
075            }
076            textBegin.setText(String.valueOf(beginCall));
077            textEnd.setText(String.valueOf(endCall));
078            textBoxSize = new JTextField(String.valueOf(boxSize));
079        }
080    
081        protected void updateConfiguration() {
082    
083            if (textBegin == null)
084                textBegin = new JTextField(String.valueOf(beginCall));
085            if (textEnd == null)
086                textEnd = new JTextField(String.valueOf(endCall));
087            if (textBoxSize == null)
088                textBoxSize = new JTextField(String.valueOf(boxSize));
089    
090            try {
091                beginCall = Integer.parseInt(textBegin.getText());
092                endCall = Integer.parseInt(textEnd.getText());
093                boxSize = Integer.parseInt(textBoxSize.getText());
094    
095                super.updateConfiguration();
096            } catch (NumberFormatException e) {
097                Scene.showErrorMessage("Begin call and end call must be an integer and smaller than "+Integer.MAX_VALUE+".");
098                configure();
099            };
100    
101        }
102    
103        public HashMap getCurrentConfigure() {
104            try {
105                HashMap configure = super.getCurrentConfigure();
106    
107                VizInfo vizInfo = new VizInfo();
108                vizInfo.setFactory((VisualizationFactory)configure.get("Factory"));
109                vizInfo.setSubject((ElementDefinition)configure.get("Subject"));
110                String[] dimensionDefs = new String[3];
111                dimensionDefs[0] = xAxis.getName() ;
112                dimensionDefs[1] = entityIdFilter.getName() ;
113                dimensionDefs[2] = filter2.getName();
114                configure.put("Dimension",vizInfo.createDimension(dimensionDefs));
115                configure.put("Predictor",factory[comboPredictor.getSelectedIndex()]);
116    
117                configure.put("Interval", new Integer(interval));
118                configure.put("BeginCall", new Long(beginCall));
119                configure.put("EndCall", new Long(endCall));
120                configure.put("Match", new Float(boxSize));
121                configure.put("Options",painters[selectedPainter].getName());
122    
123                return configure;
124            }catch (VizInfoCreateException e) {
125                Scene.showErrorMessage(e.getMessage());
126            }
127            return null;
128        }
129    
130        public Dimension[] createDimension() {
131            Dimension [] returnDimension = new Dimension[3];
132    
133            xAxis = new ValueDimension();
134            entityIdFilter = new ReferenceDimension();
135            filter2 = new ReferenceDimension();
136    
137            returnDimension[0] = xAxis;
138            returnDimension[1] = entityIdFilter;
139            returnDimension[2] = filter2;
140    
141            return returnDimension;
142        }
143    
144        protected Component createPanel() {
145            Component returnVal = super.createPanel();
146            canvas.setPanelFlag(AxesPanel.Null);
147            canvas.setZoomingSize(50,50);
148            flipMagnifier = false;
149            addMagnifier(canvas,flipMagnifier);
150    
151            return returnVal;
152        }
153    
154        public void preVisualize() {
155            super.preVisualize();
156            image = new AutoShapeImage(new EVolve.util.painters.shapes.Box(0,0,boxSize,boxSize));
157            entityMapImage = new AutoShapeImage(new EVolve.util.painters.shapes.Box(0,0,boxSize,boxSize));
158            canvas.setShapeSize(boxSize);
159            if (selectedPainter == 0) {
160                predictor = new Predictor[entityIdFilter.getMaxEntityNumber()];
161                for (int i = 0; i < predictor.length; i++) {
162                    if (comboPredictor == null)
163                        predictor[i] = factory[0].createPredictor();
164                    else
165                        predictor[i] = factory[comboPredictor.getSelectedIndex()].createPredictor();
166                }
167            }
168            getSelection();
169            installPainter();
170        }
171    
172        protected void receiveElement(Element element) {
173            if (element.isOptional()) return;
174    
175            long no = xAxis.getField(element) - 1;
176            long traceId = entityIdFilter.getField(element);
177            long z = filter2.getField(element);
178    
179    
180            countEvents(no);
181            if ((no < beginCall)||(no > endCall)) {
182                return;
183            }
184            if (selectedPainter != RandomColorPainter)
185                painters[1].paint(entityMapImage,(no-beginCall)%(panel.getWidth()/boxSize),
186                                 (no-beginCall)/(panel.getWidth()/boxSize),traceId);
187    
188            if (selectedPainter == PredictionPainter) {// prediction color painter
189                painter.paint(image,no-beginCall,traceId,filter2.getEntityFromInt((int)z).getId());
190            } else {
191                painter.paint(image,(no-beginCall)%(panel.getWidth()/boxSize),
192                             (no-beginCall)/(panel.getWidth()/boxSize),traceId);
193            }
194        }
195    
196        public void visualize() {
197            sort();
198        }
199    
200        public void sort() {
201            try {
202                int width = panel.getWidth() - ((JScrollPane)panel).getVerticalScrollBar().getWidth();
203                canvas.setShapeSize(boxSize);
204                ((AutoShapeImage)image).reArrange(width,boxSize);
205                if (selectedPainter != 1) ((AutoShapeImage)entityMapImage).reArrange(width,boxSize);
206                BufferedImage result = image.getImage();
207                canvas.setImage(result);
208                canvas.setPreferredSize(new java.awt.Dimension(result.getWidth(),result.getHeight()));
209                canvas.revalidate();
210                canvas.repaint();
211            } catch (NoDataPlotException e) {
212                Scene.showErrorMessage(e.getMessage());
213            }
214        }
215    
216        protected void mouseMove(int x,int y) {
217            int X = canvas.getImageX(x);
218            int Y = canvas.getImageY(y);
219            AutoShapeImage aImage = (AutoShapeImage)image;
220            if (selectedPainter != 1)
221                aImage = (AutoShapeImage)entityMapImage;
222            Color color= (aImage == null) ? null : (Color)aImage.getColor(X/boxSize,Y/boxSize);
223            if (color != null) {
224                int mappedId = (int)((RandomPainter)painters[1]).getKeyFromColor(color);
225                Entity entity = entityIdFilter.getEntityFromInt(mappedId);
226                if (entity != null) {
227                    Scene.setStatus(entity.getName()
228                                    + " " + xAxis.getDataFilter().getName()+":"+ (x/boxSize + aImage.getW() * (y/boxSize)));
229                }
230            } else {
231                Scene.setStatus(" ");
232            }
233        }
234    
235        public void makeSelection() {
236            int w = image.getW();
237            int startX = canvas.getStartX()/boxSize;
238            int endX = canvas.getEndX()/boxSize;
239            int startY = canvas.getStartY()/boxSize;
240            int endY = canvas.getEndY()/boxSize;
241    
242            if (dataSourceId != Scene.getDataSourceManager().getCurrentDataSourceId()) {
243                Scene.showErrorMessage("The active data source used currently is different from \n" +
244                                       "this visualization, please choose \"" +
245                                       Scene.getDataSourceManager().getUsedDataSourceName(dataSourceId)+"\".");
246                return;
247            }
248    
249            long start = startX+startY*w;
250            long end = endX+endY*w;
251            long eventInterval[] = findEventInterval(start+beginCall, end+beginCall);
252            start = eventInterval[0];
253            end = eventInterval[1];
254    
255            ArrayList idList = new ArrayList();
256    
257            for (int i=startX; i<=endX; i++) {
258                for (int j=startY; j<=endY; j++) {
259                    Long id = new Long(((RandomPainter)painter).getKeyFromColor((Color)image.getColor(i,j)));
260                    if (!idList.contains(id))
261                        idList.add(id);
262                }
263            }
264    
265            int selection[] = null;
266            if ((SELECT_OPTION & 0x00f0) == SELECT_OCCURRED_ENTITIES) {
267                selection = new int[idList.size()];
268                for (int i=0; i<selection.length; i++)
269                    selection[i] = ((Long)idList.get(i)).intValue();
270            } else {
271                selection = new int[entityIdFilter.getEntityNumber()];
272                for (int i=0; i<selection.length; i++)
273                    selection[i] = i;
274            }
275            if ((SELECT_OPTION & 0x000f) == 0x0000) {
276                start = 0;
277                end = Long.MAX_VALUE;
278            }
279            entityIdFilter.makeSelection(subjectDefinition.getType(),selection,start,end,timeMap);
280        }
281    
282        public JMenuItem[] createSelectionMenuItem() {
283            if (selectionMenu != null) return selectionMenu;
284    
285            itemSelectTimeFrame = new JCheckBoxMenuItem("Time Frame");
286            itemSelectTimeFrame.setMnemonic(KeyEvent.VK_T);
287            itemSelectTimeFrame.addActionListener(new ActionListener() {
288                public void actionPerformed(ActionEvent e) {
289                    boolean selected = itemSelectTimeFrame.isSelected();
290                    SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_TIME_FRAME);
291                }
292            });
293            itemSelectTimeFrame.setSelected(true);
294    
295            itemSelectX = new JCheckBoxMenuItem("Occurred Entitiies");
296            itemSelectX.setMnemonic(KeyEvent.VK_O);
297            itemSelectX.addActionListener(new ActionListener() {
298                public void actionPerformed(ActionEvent e) {
299                    boolean selected = itemSelectX.isSelected();
300                    SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_OCCURRED_ENTITIES);
301                }
302            });
303            itemSelectX.setSelected(true);
304    
305            selectionMenu = new JMenuItem[2];
306            selectionMenu[0] = itemSelectTimeFrame;
307            selectionMenu[1] = itemSelectX;
308    
309            return selectionMenu;
310        }
311    
312        public int getBoxSize() {
313            return boxSize;
314        }
315    
316        protected void installPainter() {
317            painters = createPainters();
318            painter = painters[selectedPainter];
319            if (selectedPainter == 0)
320                ((EventPredictionPainter)painter).setParameters(predictor,filter2.getDataFilter().getTargetType(),panel.getWidth()/boxSize);
321        }
322    
323        protected ArrayList createOptionalMenu() {
324            if (menuList.size() > 0) return null;
325    
326            menuList.clear();
327            itemReArrange = new JMenuItem("Rearrange");
328            itemReArrange.setMnemonic(KeyEvent.VK_R);
329            itemReArrange.addActionListener(new ActionListener() {
330                public void actionPerformed(ActionEvent e) {
331                    String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(),
332                            "Input new size for rectangles:",
333                            "Rearrange",
334                            JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(boxSize));
335                    if (newSize!=null) {
336                        boxSize = Integer.parseInt(newSize);
337                        if (selectedPainter != 1)
338                            ((AutoShapeImage)entityMapImage).reArrange(panel.getWidth(),boxSize);
339                        sort();
340                    }
341                }
342            });
343    
344            menuList.add(itemReArrange);
345            return menuList;
346        }
347    
348        public Object clone() {
349            EventViz o = (EventViz)super.clone();
350            o.dimension[0] = o.xAxis;
351            o.dimension[1] = o.entityIdFilter;
352            o.dimension[2] = o.filter2;
353            o.createDialog();
354            o.createMenu();
355            o.menuList = new ArrayList();
356            o.updateMenu();
357            o.painters = new Painter[3];
358            for (int i=0; i<o.painters.length; i++)
359                o.painters[i] = (Painter)painters[i].clone();
360            o.entityMapImage = (AutoShapeImage)entityMapImage.clone();
361    
362            return o;
363        }
364    
365        /**
366     *  customize UI
367     */
368        protected void createDialog() {
369            dialog = new JDialog(Scene.getFrame(), "Configure", true);
370    
371            JPanel panelTitle = new JPanel(new FlowLayout());
372            dialog.getContentPane().add(panelTitle, BorderLayout.NORTH);
373    
374            panelTitle.add(new JLabel("Title: "));
375    
376            textName = new JTextField(name, 12);
377            panelTitle.add(textName);
378    
379            JPanel panelMain = new JPanel(new BorderLayout());
380            panelMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Choose subject & dimensions"));
381            dialog.getContentPane().add(panelMain, BorderLayout.CENTER);
382    
383            JPanel panelName = new JPanel(new GridLayout(definition.getDimensionDefinition().length , 1, 5, 5));
384            panelMain.add(panelName, BorderLayout.WEST);
385    
386            panelName.add(new JLabel(" Subject:      "));
387            for (int i = 0; i < definition.getDimensionDefinition().length - 1; i++) {
388                panelName.add(new JLabel(" " + definition.getDimensionDefinition()[i].getName() + ":      "));
389            }
390    
391            JPanel panelCombo = new JPanel(new GridLayout(definition.getDimensionDefinition().length, 1, 5, 5));
392            panelMain.add(panelCombo, BorderLayout.CENTER);
393    
394            comboSubject = new JComboBox();
395            for (int i = 0; i < elementDefinition.length; i++) {
396                comboSubject.addItem(elementDefinition[i].getName());
397            }
398            comboSubject.addActionListener(new ActionListener() {
399                public void actionPerformed(ActionEvent e) {
400                    updateComboSubject();
401                }
402            });
403            panelCombo.add(comboSubject);
404    
405            comboDimension = new JComboBox[definition.getDimensionDefinition().length];
406            for (int i = 0; i < comboDimension.length; i++) {
407                comboDimension[i] = new JComboBox();
408                comboDimension[i].addActionListener(new ActionListener() {
409                    public void actionPerformed(ActionEvent e) {
410                        updateComboDimension();
411                    }
412                });
413            }
414            for (int i = 0; i < comboDimension.length - 1; i++)
415                panelCombo.add(comboDimension[i]);
416    
417            JPanel returnVal = new JPanel(new GridLayout(1, 1, 5, 5));
418            JPanel panelEvent = new JPanel(new GridLayout(6,2));
419    
420            Box panelBottom = new Box(BoxLayout.Y_AXIS);
421            returnVal.add(panelBottom);
422    
423            comboPredictor = new JComboBox();
424            for (int i = 0; i < factory.length; i++) {
425                comboPredictor.addItem(factory[i].getName());
426            }
427    
428            comboPainter = new JComboBox();
429            for (int i = 0; i < painters.length; i++) {
430                comboPainter.addItem(painters[i].getName());
431            }
432            comboPainter.addActionListener(new ActionListener() {
433                public void actionPerformed(ActionEvent e) {
434                    selectedPainter = comboPainter.getSelectedIndex();
435                    if (selectedPainter == 0) {
436                        comboPredictor.setEnabled(true);
437                        comboDimension[comboDimension.length-1].setEnabled(true);
438                    } else {
439                        comboPredictor.setEnabled(false);
440                        comboDimension[comboDimension.length-1].setEnabled(false);
441                    }
442                }
443            });
444            comboPainter.setSelectedIndex(selectedPainter);
445    
446            panelEvent.add(new JLabel("Painter used:  "));
447            panelEvent.add(comboPainter);
448            panelEvent.add(new JLabel(definition.getDimensionDefinition()[comboDimension.length -1].getName() + ":   "));
449            panelEvent.add(comboDimension[comboDimension.length -1]);
450            panelEvent.add(new JLabel("Predictor: "));
451            panelEvent.add(comboPredictor);
452            panelEvent.add(new JLabel("From Event No:"));
453            panelEvent.add(textBegin);
454    
455            String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName()));
456            toEventNo = new JLabel("To Event No:("+range+")");
457            panelEvent.add(toEventNo);
458            panelEvent.add(textEnd);
459            panelEvent.add(new JLabel("Box Size:"));
460            panelEvent.add(textBoxSize);
461    
462            panelBottom.add(panelEvent);
463    
464            updateComboSubject();
465    
466            panelMain.add(returnVal, BorderLayout.SOUTH);
467    
468            JPanel panelButton = new JPanel(new FlowLayout());
469            dialog.getContentPane().add(panelButton, BorderLayout.SOUTH);
470    
471            JButton buttonApply = new JButton("Apply");
472            buttonApply.addActionListener(new ActionListener() {
473                public void actionPerformed(ActionEvent e) {
474                    dialogApply();
475                }
476            });
477            panelButton.add(buttonApply);
478    
479            JButton buttonCancel = new JButton("Cancel");
480            buttonCancel.addActionListener(new ActionListener() {
481                public void actionPerformed(ActionEvent e) {
482                    dialogCancel();
483                }
484            });
485            panelButton.add(buttonCancel);
486    
487            //*************
488            for (int i=0; i<comboSubject.getItemCount(); i++) {
489                if ((comboSubject.getItemAt(i)).equals(subjectDefinition.getName())) {
490                    comboSubject.setSelectedIndex(i);
491                    break;
492                }
493            }
494            for (int i=0;i<comboDimension.length;i++) {
495                for (int j =0 ; j<comboDimension[i].getItemCount();j++) {
496                    if (comboDimension[i].getItemAt(j).equals(dimension[i].getDataFilter().getName())) {
497                        comboDimension[i].setSelectedIndex(j);
498                        break;
499                    }
500                }
501            }
502        }
503    
504        protected void updateComboSubject() {
505            super.updateComboSubject();
506            String range = String.valueOf(Scene.getDataManager().getDataSource().getNumberOfEvents(elementDefinition[comboSubject.getSelectedIndex()].getName()));
507            toEventNo.setText("To Event No:("+range+")");
508        }
509    
510    }